import java.util.*;
/**
 * @info    Klasse, welke een compleet process van het programma simuleerd.
 * @author  (Stephan Veenstra, Michel Jansma) 
 * @version (2012.10.02)
 */

public class CanteenSimulation {
    // Canteen
    private Canteen canteen;
    
    //Supply
    private CanteenSupply supply;
    
    //Random generator
    private Random random;
    
    // aantal artikelen
    private static final int AMOUNT_ARTICLES = 4;
    
    // Artikelen
    private static final String[] articleNames = new String[]{
        "Koffie", "Broodje hamburger","Broodje kaas", "Melk" };
        
    //prijzen
    private static double[] articlePrices = new double[]{
        1.50,2.10,1.65,1.65};
        
    // minimum en maximum aantal artikelen per soort
    private static final int MIN_ARTICLES_PER_KIND = 10;
    private static final int MAX_ARTICLES_PER_KIND = 20;
    
    // minimum en maximum aantal personen per dag
    private static final int MIN_PERSONS_PER_DAY = 50;
    private static final int MAX_PERSONS_PER_DAY = 100;
    
    // minimum en maximum artikelen per persoon
    private static final int MIN_ARTICLES_PER_PERSON = 1;
    private static final int MAX_ARTICLES_PER_PERSON = 4;
    
    private static final int NUMBER_OF_STUDENTS  = 89, 
                             NUMBER_OF_TEACHERS  = 10, 
                             NUMBER_OF_EMPLOYEES = 1;
    
    
    /**
     * Constructor
     */
    public CanteenSimulation(){
        canteen = new Canteen();
        random = new Random();
        int[] hoeveelheden = getRandomArray(
                                AMOUNT_ARTICLES,
                                MIN_ARTICLES_PER_KIND,
                                MAX_ARTICLES_PER_KIND);
        supply = new CanteenSupply(articleNames,articlePrices, hoeveelheden); 
        canteen.setSupply(supply);
    }
    
    /**
     * Methode om een array van random getallen liggend tussen de min en max
     * van de gegeven lengte te genereren
     * @param   lengte
     * @para min
     * @param max
     * @return De array met random getallen
     */
    private int[] getRandomArray(int lengte, int min, int max){
        int[] temp = new int[lengte];
        for(int i = 0; i < lengte; i++){
            temp[i] = getRandomValue(min,max);
        }
        return temp;
    }
    
    /**
     * Methode om een random getal tussen min(incl) en max(incl) te genereren
     * @param min
     * @param max
     * @return Een random getal
     */
    private int getRandomValue(int min, int max){
        return random.nextInt(max-min+1)+min;
    }
    
    /**
     * Methode om op basis van een array van indexen voor de array
     * articleNames de bijbehorende array van articleNames te maken
     * @param indexen
     * @return De array met articleNames
     */
    private String[] getArticleNames(int[] indexen){
        String[] articles = new String[indexen.length];
        for(int i=0; i<indexen.length ; i++){
            articles[i] = articleNames[indexen[i]];
        }
        return articles;
    }
    

    /**
     * @method runCanteenSimulation
     * @params <int> ammountOfDays
     * @info   Run kantine simulatie
     * @return null
     */
    public void runCanteenSimulation(int ammountOfDays) {
        
        //Totaal aantal personen
        int personCount = (NUMBER_OF_STUDENTS + NUMBER_OF_TEACHERS + NUMBER_OF_EMPLOYEES);
        //List met personen
        ArrayList<Person> persons = new ArrayList<Person>();
        for(int i = 0; i < personCount; i++) {
            //Voeg werknemers toe aan person list
            if(i < NUMBER_OF_EMPLOYEES) {
                persons.add(new Employee());
            //Voeg leraren toe aan person list
            } else if(i - NUMBER_OF_EMPLOYEES < NUMBER_OF_TEACHERS) {
                persons.add(new Teacher());
            //Voeg stuenten toe aan person list
            } else {
                persons.add(new Student());
            }
        }
        
        //Loop door dagen
        for(int day = 0; day < ammountOfDays; day++) {
            //Loop door personen
            for(Person person : persons) {
                //Toon persoonlijke data
                person.getData();
                //Aantal artikelen
                int aantalArtikelen = this.getRandomValue(MIN_ARTICLES_PER_PERSON, MAX_ARTICLES_PER_PERSON);
                //Artikel nummers
                int[] tepakken      = this.getRandomArray(aantalArtikelen, 0, AMOUNT_ARTICLES-1);
                //Artikelen
                String[] articles   = this.getArticleNames(tepakken);
                //Persoon gaat in rij staan
                this.canteen.personGetTrayConnectLine(person, articles);
            }
            
            canteen.handleCheckoutLine();
            System.out.println("Totaal omzet: " + canteen.getCheckout().getCheckoutContent());
            System.out.println("Aantal personen: "+ persons.size());
            System.out.println("Aantal artikelen: "+ canteen.getCheckout().getCheckoutArticles());
            canteen.getCheckout().resetCheckout();
            
        }
    }
    
    /*public void simuleer(int days) {
        // for lus voor de dagen
        for(int i = 0; i < days; i++){
            int aantalPersonen = 60;
            
            for(int j = 0; j < aantalPersonen; j++){
                //maak persoon en dienblad + koppel ze
                Person person = new Person("Persoon"+(i+1));
                
                // bedenk hoeveel artikelen worden gepakt
                int aantalArtikelen = getRandomValue(MIN_ARTICLES_PER_PERSON,MAX_ARTICLES_PER_PERSON);
                
                // genereer de 'artikelnummers', dit zijn de indexen
                //van de articleNames array
                int[] tepakken = getRandomArray(aantalArtikelen,0,AMOUNT_ARTICLES-1);
                
                // vind de articleNames op basis van de indexen hierboven
                String[] articles = getArticleNames(tepakken);
                
                //loop de kantine binnen, pak de gewenste artikelen, sluit aan
                canteen.personGetTrayConnectLine(person, articles);
                
            }
            
            // verwerk de rij voor de kassa
            canteen.handleCheckoutLine();
            //druk de dagtotalen af en hoeveel personen binnen zijn gekomen
            System.out.println("Totaal omzet: " + canteen.getCheckout().getCheckoutContent());
            System.out.println("Aantal personen: "+ aantalPersonen);
            System.out.println("Aantal artikelen: "+ canteen.getCheckout().getCheckoutArticles());
            //reset de kassa voor de volgende dag
            canteen.getCheckout().resetCheckout();
        }
    }*/
    
    /**
     * Return de minimale hoeveelheid voorraad van de artikelen
     */    
    public static int getMIN(){
        return MIN_ARTICLES_PER_KIND;
    }
    
    /**
     * Return de maximale hoeveelheid voorraad van de artikelen
     */
    public static int getMAX(){
        return MAX_ARTICLES_PER_KIND;
    }
    
}
